FUNCTION func_y2k as c ( in_date as c )
DIM date_c as c

'***************************************************************************
'***************************************************************************
'***                *** *** NOTE: *** ***
'***
'***	THIS SCRIPT IS SIMILAR TO THE SCRIPT USED TO CHECK y2k ISSUES
'***	FOR NORMAL DATE FIELDS.  IT IS MODIFIED TO CHECK INPUT FROM
'***	ui_get_date FUNCTIONS.  ie, IT CHECKS INPUTS FROM A SCRIPT
'***	VARIABLE RATHER THAN THE a_field_value VARIABLE.
'***
'***   WRITTEN BY:  Cal Locklin (CALocklin@aol.com); Aug. 1997
'***		for Alpha Five version 1.02
'***   LAST UPDATE:  Nov. 14, 1998
'***************************************************************************
'***************************************************************************

'***************************************************************************
'***************************************************************************
'*** This script is used as a function call IMMEDIATELY after a call to
'*** UI_GET_DATE to fix the y2k issue.  A5 will correctly save all dates
'*** as 4 digits but, if a year is input as only 2 digits, it will save it
'*** as 4 digits but in the 20th century.
'*** This script allows two options which must be selected in the
'*** script itself by the programmer: (see Routines 1 and 2 below)
'***   1. (default ) All 2 digit dates default to the nearest year to
'***      the current year.  (eg: 50 years from current)
'***   2. All 2 digit dates default to the current century
'***      (eg: 90 = 1990 during 1999  -BUT-  90 = 2090 during 2000
'***
'***************************************************************************
'***************************************************************************
'*** HOW TO USE THIS SCRIPT:
'*** 	1. Save a copy of this script in the database being used.
'***   2. Near the beginning of any script using a call to UI_GET_DATE, type
'***      the following line:
'*** 			INCLUDE Func_y2k
'***		NOTES: 
'***			(a)	the function name MUST be typed with the same
'***				capitalization as the script saved in line 1.
'***			(b)	the INCLUDE line MUST be put before any line
'***				which calls the function.
'***   3. IMMEDIATELY after the UI_GET_DATE command, call this function to
'***		correct the DATE variable for y2k issues.
'*** 
'***	EXAMPLE:
'***		INCLUDE Func_y2k
'***		<< additional script lines >>
'***		input_date = ui_get_date( "Start Date", "Input the start date" )
'***		input_date = func_y2k( input_date )
'***************************************************************************
'***************************************************************************

'*** 3 CHAR OR LESS INPUT:  (01/)
	'-----------------------------------------------------------------
	'--- IF THE USER INPUT LESS THAN 4 CHARACTERS, THEN THE DATE
	'--- INPUT IS NOT COMPLETE.  LET THE SYSTEM HANDLE IT.
	'--- ACTUALLY, THIS ROUTINE SHOULD BE REDUNDANT, THE SYSTEM
	'--- SHOULD DETECT THIS PROBLEM BEFORE THE y2k_fix FUNCTION BEGINS.
	'--- THIS IS ONLY INCLUDED AS A SAFETY VALVE.
	'-----------------------------------------------------------------
	IF len( trim( in_date )) < 4
		date_c = in_date
		goto func_done
	END IF

'*** 4 CHAR INPUT:  (01/1)
	'-----------------------------------------------------------------
	'--- IF THE USER HAS NOT PUT A ZERO IN FRONT OF A DAY, ADD IT.
	'--- 	EXAMPLE:  THE USER INPUT "03/8" INSTEAD OF "03/08"
	'--- NOTE 1: THIS IS NOT PART OF THE y2k FIX.  IT IS A "BONUS" FIX.
	'--- NOTE 2: THIS CAN'T BE DONE IF ANY PART OF A YEAR IS INPUT.  ALSO,
	'---         IF THE ui_get_date IS OPENED WITH THE DEFAULT STRING OF 
	'---         "  /  /  ", IT HAS NO EFFECT BECAUSE THE LAST "/" MAKES 
	'---         THE STRING TOO LONG.
	'-----------------------------------------------------------------
	IF len( trim( in_date )) = 4
		in_date = stuff( in_date, 4, 0, "0")
		in_date = in_date + "/"
		'--- LENGTH OF in_date NOW EQUALS 6 SO IT WILL BE CHANGED AGAIN BELOW.
	END IF

'--- BETWEEN THE NEXT "*****" LINES IS A SPECIAL SECTION FOR ui_get_date THAT
'--- IS NOT NECESSARY IN THE y2k_fix SCRIPT.
'*************************************************************************************	
'-------------------------------------------------------------------------
'--- THE DEFAULT ui_get_date FUNCTION WORKS DIFFERENTLY THAN THE STANDARD
'--- DATE FIELD INPUT.  THE DEFAULT FUNCTION SETS THE DEFAULT STRING TO
'--- "  /  /  ".  THIS DEFAULT ALLOWS YOU TO GET BLANK SPACES EMBEDDED IN
'--- THE DATE FIELD  -  THIS IS USUALLY THE SIGN OF AN ERROR.
'--- IF YOU SET THE DEFAULT STRING TO ONE BLANK SPACE, THEN THE FUNCTION
'--- WORKS THE SAME AS A REGULAR DATE FIELD.
'-----------------------------------------------------------------

	'-----------------------------------------------------------------
	'--- CHECK FOR EMBEDDED BLANK SPACES IN THE DATE.  WITH ui_get_date
	'--- IT'S POSSIBLE THIS IS AN ERROR.  SO, DON'T ALLOW THEM AT ALL.
	'-----------------------------------------------------------------
	bpos = at( " ", trim( in_date ))
	IF bpos > 0
		'--- PUT AN UNDERSCORE IN SO IT ALWAYS PRINTS TOGETHER IN THE MESSAGE BOX.
		in_date = stuff( in_date, bpos, 1, "_" )
		bpos = at( " ", left( in_date, len(trim(in_date)) ))
		IF bpos > 0	'CHECK FOR A SECOND BLANK SPACE
			in_date = stuff( in_date, bpos, 1, "_" )
		END IF
		ui_msg_box( "*** DATE ERROR ***", "No blank spaces are allowed between date characters.  The date you input was " + in_date + ".  PLEASE RE-ENTER THIS DATE OR RE-RUN THIS OPERATION TO GET THE CORRECT DATE.", 16 )
		'--- MAKE func_y2k RETURN AN EMPTY STRING SO IT LOOKS THE SAME 
		'--- AS HITTING THE CANCEL BUTTON.
		func_y2k = ""
		goto func_done
	END IF
'*************************************************************************************	

'*** 5 CHAR INPUT:  (01/01)
	'-----------------------------------------------------------------
	'NOTE:  IT IS IMPOSSIBLE TO INPUT ONLY 5 CHARACTERS.  AS SOON AS THE 
	'--- FIFTH CHARACTER IS TYPED, THE A5 FUNCTION ADDS THE "/" CHARACTER.
	'-----------------------------------------------------------------

'********************************************************************
'*** NOTE: **********************************************************
'********************************************************************
'*** THE FOLLOWING 2 CHOICES (=6, >8) ARE SEPARATED HERE SO THE "=6" 
'*** VERSION CAN BE MODIFIED TO CREATE AN OUTPUT STRING THAT ALWAYS
'*** INCLUDES THE FULL YEAR.  BY DOING THIS HERE, IT IS NOT NECESSARY
'*** TO USE A SEPARATE LINE WITH "dtoc(ctod(...))" IN THE CALLING
'*** SCRIPT IN ORDER TO PASS/VIEW/ETC.
'********************************************************************

'*** 6 CHAR INPUT:  (01/01/)
	'-----------------------------------------------------------------
	'--- IF THE USER HAS NOT PUT IN ANY YEAR, DON'T CHANGE IT.  BUT,
	'--- CONVERT IT TO THE CURRENT YEAR SO ALL OUTPUT FROM Func_y2k
	'--- HAS THE FULL CHARACTER DATE INCLUDING THE CENTURY.
	'-----------------------------------------------------------------
	IF len( trim( in_date )) = 6
		date_c = trim( in_date ) + cyear( DATE())
		GOTO y2k_done
	END IF

'*** 9 or 10 CHAR INPUT:  (01/01/100) or (01/01/1997)
	'-----------------------------------------------------------------
	'--- IF THE USER HAS INPUT A FULL DATE, INCLUDING CENTURY AND YEAR,
	'--- DON'T CHANGE IT.
	'--- (10 CHARACTERS NORMALLY OR 9 FOR CENTURIES 101-999.)
	'--- CATCH 22:  ANY DATE PRIOR TO CENTURY 100 CANNOT BE SAVED. THIS
	'---            IS THE WAY A5 HAS ALWAYS BEEN.
	'----------------------------------------------------------------
	'--- CHANGE ANY 3 DIGIT YEAR TO HAVE A LEADING "0" SO ALL OUTPUT 
	'--- WILL HAVE 10 CHARACTERS.  THIS WAS NOT NECESSARY IN THE y2k_fix SCRIPT.
	'----------------------------------------------------------------
	SELECT
	CASE len( trim( in_date )) = 9
		date_c = stuff( in_date, 7, 0, "0" )
		GOTO y2k_done
	CASE len( trim( in_date )) = 10
		date_c = in_date
		GOTO y2k_done
	END SELECT
	
'*** 7 OR 8 CHAR INPUT:  (CHARS 7 & 8 ARE THE YEAR)
'******   	EVERYTHING BETWEEN HERE AND THE 'y2k_done' LABEL
'******   ASSUMES ONLY A 1 OR 2 DIGIT YEAR HAS BEEN INPUT.

	'-----------------------------------------------------------------
	'--- DETERMINE THE CURRENT CENTURY and YEAR BASED ON SYSTEM DATE.
	'--- THIS ASSUMES THAT THE COMPUTER'S SYSTEM DOES NOT HAVE ITS
	'--- OWN YEAR y2k PROBLEM.
	'-----------------------------------------------------------------
	current_century_c = substr( dtoc( DATE()), 7, 2 )
	current_century = val( current_century_c )
	next_century_c = ltrim( str( current_century + 1 ))
	last_century_c = ltrim( str( current_century - 1 ))
	
	current_year_c = substr( dtoc( DATE()), 9, 2 )
	current_year = val( current_year_c )
	
	'-----------------------------------------------------------------
	'--- DETERMINE THE CURRENT 2 DIGIT YEAR BASED ON INPUT.
	'-----------------------------------------------------------------
	input_year_c = substr( in_date, 7, 2 )
	IF len( trim( input_year_c )) = 1
		input_year_c = "0" + input_year_c
	END IF
	input_year = val( input_year_c )
	
'-----------------------------------------------------------------
'  FIRST SET A "TEST" VALUE FOR date_c SO WE CAN CHECK TO BE SURE
'  ONLY ONE OPTION IS CHOSEN BELOW.  (BY THE PROGRAMMER - NOT USER.)
'  date_c IS CHANGED WHENEVER A CORRECT DATE STRING IS ACHIEVED.
'-----------------------------------------------------------------
'  ANY TIME date_c WAS SET ABOVE, IT WENT DIRECTLY TO LABEL
'  'Func_done'  OR  'y2k_done'  SO, IF IT REACHES THIS POINT, IT HAS 
'  NOT BEEN SET PREVIOUSLY.
'-----------------------------------------------------------------
date_c = "start"	

'********************************************************************
'*** WE ARE NOW READY TO ACTUALLY CONVERT THE DATE STRING.
'*** TWO OPTIONS FOLLOW:
'***   (1) TWO DIGIT YEARS DEFAULT TO WITHIN 50 YEARS OF THE CURRENT DATE.
'***		 [defined so 2050 gives a range of 2000 - 2099]
'***   (2) TWO DIGIT YEARS DEFAULT TO THE CURRENT CENTURY.
'*** SELECT THE OPTION YOU WANT BY "REMMING OUT" THE OPTION YOU DON'T WANT.
'********************************************************************

'********************************************************************
'*** OPTION 1:  *******  WITHIN 50 YEARS OF THE CURRENT DATE. *******
'********************************************************************
	SELECT
	CASE current_year < 50 .and. input_year > current_year + 49
		year_c = last_century_c + input_year_c
		date_c = left( in_date, 6) + year_c
	CASE current_year > 50 .and. input_year < current_year - 50
		year_c = next_century_c + input_year_c
		date_c = left( in_date, 6) + year_c
	CASE ELSE
		year_c = current_century_c + input_year_c
		date_c = left( in_date, 6) + year_c
	END SELECT

'********************************************************************
'*** OPTION 2:  *******  SAME AS THE CURRENT CENTURY *******
'********************************************************************
'	IF date_c <> "start"
'		ui_beep()
'		ui_msg_box( "**** ERROR ****", "You have not remmed out the first y2k option.  You must go into the script and 'rem out' the option you DON'T want to use.", 16 )
'		END
'	END IF
'	date_c = left( in_date, 6 ) + current_century_c + input_year_c

'*******************************************************************
'****  END OF y2k ROUTINES.
'*******************************************************************

y2k_done:	
	func_y2k = date_c

'*** NOTE: AT THIS POINT, THE FUNCTION OUTPUT IS A STRING WITH THE FULL YEAR INCLUDED.
'***       THE ONLY OTHER POSSIBILITY IS THAT THE DATE INPUT WAS BAD AND THIS FUNCTION
'***       NEVER ACTUALLY STARTED.


'****************************************************************************
'*** LEAP DAY FIX ***********************************************************
'****************************************************************************
'***  THE NEXT PART OF THIS SCRIPT IS ACTUALLY ANOTHER SCRIPT WHICH FIXES
'***  A SMALL 'GLITCH' IN THE A5 DATES.
'***  A5 CONVERTS 02/29/xx TO 03/01/xx IF "xx" IS NOT A LEAP YEAR.
'***  THIS CAN BE A PROBLEM IF YOU THINK YOU ARE GETTING, FOR EXAMPLE, A 
'***  REPORT FOR ONLY THE MONTH OF FEBRUARY - INSTEAD, IT WILL INCLUDE THE 
'***  FIRST DAY OF MARCH ALSO.
'****************************************************************************
'****************************************************************************

'----------------------------------------------------------------------------
'--- IF DATE ISN'T 02/29, EVERYTHING IS OK - STOP IMMEDIATELY.
'----------------------------------------------------------------------------
IF left( date_c, 6 ) <> "02/29/"
	goto func_done
END IF

'----------------------------------------------------------------------------
'--- I USE substr HERE FOR THE BENEFIT OF ANY HISTORIANS OUT THERE.  DATES 
'--- BETWEEN 100 AND 999 WILL BE CHECKED THIS WAY.  DATES BETWEEN 0 AND 99
'--- ARE NOT POSSIBLE BECAUSE THEY ARE TREATED LIKE 2 DIGITS YEARS.  A5 HAS
'--- ALWAYS BEEN THIS WAY.  (AS ARE MANY OTHER PROGRAMS!!)
'--- NOTE: SINCE THE CALENDAR CHANGED IN 1752 IT REALLY ISN'T ACCURATE ANYWAY.
'----------------------------------------------------------------------------
year_test = val( substr( date_c, 7, 4 ))

test = "BAD"
'----------------------------------------------------------------------------
'--- IF IT IS A LEAP YEAR, CHANGE test TO "OK".  CHECK CENTURIES, TOO.
'----------------------------------------------------------------------------
IF mod( year_test, 4) = 0
	IF mod( year_test, 100 ) <> 0
		test = "OK"
	ELSE
		IF mod( year_test, 400 ) = 0
			test = "OK"
		END IF
	END IF
END IF

IF test = "BAD"
	response = ui_msg_box( "*** WARNING ***", "You have input February 29th for a year that is not a leap year.  Click YES to change it to March 1.  Click NO to change it to Feb. 28.", 4+32 )
	'--- THE "dtoc(ctod(..))" USED BELOW SEEMS REDUNDANT BUT IT IS USED BECAUSE 
	'--- THE DATE MAY HAVE BEEN INPUT WITHOUT THE YEARS AND I WANT ALL OUTPUT
	'--- FROM THIS ROUTINE TO HAVE THE FULL 10 CHARACTER DATE.
	IF response = 6
		'--- CHANGE THE DATE STRING TO MATCH THE DESIRED DATE.  (MARCH 1)
		func_y2k = dtoc( ctod( date_c ))
	ELSE
		'--- CHANGE THE DATE STRING TO MATCH THE DESIRED DATE.  (FEB. 28)
		func_y2k = dtoc( ctod( date_c ) - 1 )
	END IF
END IF

func_done:
END FUNCTION